![]() ![]() |
Macintosh クライアントの検出本テクニカルノートのいくつかの推奨事項の中では、条件に応じて、API 呼び出しまたは UI コンポーネントの配置を行うことを推奨しています。アプリケーションを実行している OS を知る最も一般的で直観的な方法は、System プロパティである
このプロパティは、どの Mac OS X システムでも Java 仮想マシンによって自動的に設定されます。テスト方法は簡単です。返される また、以降で取り上げる推奨事項の多くは、アップルの Aqua インタフェースに関するものです。つまり、Swing の Java(Metal)または Motif のルックアンドフィールには、有効または無効にしたくないかもしれないものも含まれています。Aqua が現在アクティブなルックアンドフィールであることを確認する一番良い方法は、
を呼び出して、その結果を次の結果と比較することです。
これを、 Cocoa-Java の使用Java アプリケーションを可能な限り Mac 風にする最も速くて最も明白な方法は、Cocoa-Java を使ってアプリケーションを作成することです。これにより、コンポーネントの推奨の配置やサイズにいたるまで、Interface Builder を使って、WYSIWYG により UI を手早く設計できるようになります。 Cocoa-Java のコントロールは、ムービーの簡単な埋め込みや真のフローティングツールバーウィンドウなど、Swing や AWT が提供していない機能を提供します。 もちろん、Cocoa-Java を使えば、移植性が高いという Java アプリケーションの特性は失われてしまいます。 このテクニカルノート では、ピュア Java アプリケーションに重点を置いていますが、 Cocoa-Java は言及するに値します。なぜなら、Cocoa-Java をユーザインタフェースに使用する場合、アプリケーションにおいて Cocoa ベースのコンポーネントと Carbon ベースのコンポーネントを混在させないことが重要だからです。Java に関係するものとしては、次のものがあります。
一緒に使用できない主な理由は、Carbon と Cocoa
では異なる実行ループを使っており、同じアプリケーションで使用すると衝突が生じるからです。QuickTime for Java が含まれているのが残念なようにも思えますが、Macintosh アプリケーションが必要とする簡単な QuickTime 機能(各種メディアファイルを開く、再生するなど)のほとんどは
以上をふまえた上で、本文書の残りの部分では、Swing ベースおよび AWT ベースのピュア Java アプリケーションについて説明します。 ピュア JAVA で互換性を保つためのヒントこのテクニカルノートの前半では、ピュア Java アプリケーションにおいて可能な簡単な変更または選択について説明します。これらの変更は、Mac 固有の API とプロパティに関係するというより、1つのコードベースで Mac OS X とほかのプラットフォームを同じようにサポートするために頭に入れておかなければならない事柄です。 Mac OS X、Swing、AquaMac OS X の Aqua ユーザインタフェースは、Java 自身のユーザインタフェースやほかのプラットフォームのユーザインタフェースとは大きく異なります。 Swing に対応した Aqua のプラガブルなルックアンドフィールが提供されていることは明らかに、Swing アプリケーションをより Mac 風にする上での強力な手段です。また、利用するために何の努力も要りません。つまり、コードを明示的な変更をしなくても、Mac OS X は、Swing アプリケーションに対して、起動時にデフォルトで Aqua のルックアンドフィールを採用します。 ルックアンドフィールとして Aqua が提供されていることから導き出される 1 つめの簡単な指針は、「Java アプリケーションの UI には Swing を使う」です。 Swing にはそのままで、AWT にまさる多数の基本的なメリットがあります。 そして、Aqua を利用することによって、AWT が提供する唯一ともいえるメリットもなくなります。 また、軽量と重量のコンポーネントを混在させると、パフォーマンスの上で、また描画の際に、アプリケーションに望ましくない影響を及ぼす可能性があります。 一番良いのは、Swing を使ってアプリケーションを設計するだけでなく、Java コードの中で明示的にルックアンドフィールの設定をしないようにすることです。
そして、別のプラットフォーム用にアプリケーションの
ルックアンドフィールを変更する必要がある場合は、 Aqua の外観は自動的に採用されますが、 完全な Macintosh 体験を提供するために、依然として開発者に委ねられる領域および作業があります。 このテクニカルノートにおける指針の多くは、アップル開発者のための Web サイトにある Aqua Human Interface Guidelines (PDF) に準拠しています。次に、このガイドラインで取り上げられているいくつかの細かいながらも重要な指針の例をいくつか示します。
Macintosh におけるユーザインタフェースの設計に関する詳細についてはこの文書を参照するよう強くお勧めします。我々も参照しています。 JDesktopPanes とマルチドキュメントインタフェースほとんどの Macintosh アプリケーションは、多数の、独立したフローティングウィンドウで構成されます。これらのウィンドウは、同じアプリケーションのコンテキストにはありますが、スクリーン上でアプリケーションウィンドウの境界として機能する親ウィンドウには含まれません。これは、 Macintosh がほかのプラットフォームと異なっている点でもあり、また、複数のウィンドウを持つアプリケーションを設計するときに考慮すべき点でもあります。 このため、絶対に必要という場合を除き、アプリケーションのメインの UI に、制約のある、親ウィンドウを持つ MDI モデルを採用する
MDI ベースのアプリケーションをほかのプラットフォームから Macintosh に 移植するときに、 階層ペイン構造なしに、既存のユーザ体験を提供するのが不可能だとわかる場合があります。その場合は、UI をそのままにしておく方がよいかもしれません。決めるのは開発者です。 付言として、Cocoa-Java を使って、ツールバー形式とパレット形式のコントロールを実装できます。ただし、Cocoa-Java を使用すれば、移植性は失われてしまい、Swing または AWT のコンポーネントは使えなくなります。 一般的には、アプリケーションにおいて Swing のメニューとメニュー項目クロスプラットフォーム対応の Java UI の開発においてもう 1 つ厄介なのは、メニュー項目のショートカットと外観がプラットフォームによって異なることです。残念ながら Java プログラマの多くは、開発時点で対象となっているプラットフォームだけを念頭に置いてアプリケーションを記述し、コードの中で明示的に修飾子またはトリガを指定します。そのため、プラットフォームに対応した正しいトリガが誤って解釈される危険が生まれるだけでなく、アプリケーションをほかのプラットフォームに移植するのが難しくなります。 幸い、任意のプラットフォームで、これらのアクションを作成するより洗練された解決方法があります。しかもこの方法なら移植性があります。 メニューショートカット: メニューショートカットは多くの場合、開発者が
このメソッドを呼び出すと、現在のプラットフォームの Toolkit の実装が適切なマスクを返します。この呼び出し 1 つで、現在のプラットフォームを調べ、その後、どれが正しいキーかを判断してくれます。リスト 1 にこれを示します。
Macintosh 上で行われる一般的なアクションのほとんどに、Command キーを唯一の修飾子としてではないにしろ少なくとも修飾子の 1 つとして使う、対応するキーボードショートカットがあります。残念ながら、ほかのプラットフォームにはこれほどの一貫性はなく、たとえば、Alt キーを使うキーボードショートカットもあるでしょう。上記の呼び出しは、一般的なマスクを 1 つ返すだけなので、ホストのプラットフォームを基準にした条件に基づいてショートカットキーを設定する必要があるかもしれません。Macintosh で対応するキーボードショートカットのほとんどは Command キーを使っているため、アプリケーションを Windows に移植しようとしていて、Windows 上でアクションを正しく再現できるかを心配している場合は、移植は少し楽でしょう。最も一般的な予約済みのショートカットの信頼できるリストについては、Aqua Human Interface Guidelines の keyboard equivalents の節を参照してください。
メニューアクセスキー: ほかのプラットフォームとは異なり、Mac OS X (Aqua)は、メニューアクセスキー、つまり
メニュー(Alt キーを使用)とメニュー項目(親メニューを開いているときに表示される)のための単一キーによるショートカットを提供しません。
アクセスキーは通常、メニュー(またはメニュー項目)の名前の中で 1 文字にだけ下線が付いて表示されます。
これまで Macintosh アプリケーションでメニューアクセスキーが使用されたことはありませんが、可能ならばGUI を構築するときに、コードの中で条件に応じて メニュー項目のアイコン: アクセスキーと同様、Swing によりメニュー項目でアイコンも利用できます(Mac OS X 上で機能します)が、Aqua's Human Interface Guidelines の標準には含まれていません。Macintosh の Java アプリケーションを、Carbon アプリケーションまたは Cocoa アプリケーションのような外観にするためには、これらのアイコンをプラットフォームに応じて適用するとよいでしょう。 アプリケーションがどのプラットフォーム上で動作しているかを調べる方法の詳細については、Macintosh クライアントの検出 の節を参照してください。 コンテキストメニューほとんどのプラットフォームは、なんらかの形でコンテキストメニューをサポートしているので、Java アプリケーションにコンテキストメニューを含めることには何の問題もありません(Java ではこの種のメニューを
これら 2 つは大きく異なるので、上記のメニューのコード例のように、断片的で、条件分岐するコードになるでしょう。 ただし、マウスクリックだけは共通です。プログラムに、プラットフォームに関係なく、コンテキストメニューのトリガを正しく解釈させるためには、次のインスタンスメソッドを使って、AWT に解釈をさせます。
このメソッドは、
上記のコード例は、 コンポーネントの配置と描画Swing の UI は、ネスト構造になっているコンテナとコンポーネントを組み合わせることによって構築され、多くの場合複雑になります。1 つのプラットフォームを対象に作業していると、開発者は、自分の UI の設計が、ほかのプラットフォーム上ではどのように見えるかという視点を簡単に見失ってしまいます。言葉自体が示すとおり、ルックアンドフィールが異なるということは、見た目(ルック)と使い心地(フィール)が違うということです。プラットフォームが異なり、ルックアンドフィールが異なれば、フォントサイズ、ボタンのサイズと形状、背景色と前景色などすべてが変わり得ます。コンポーネントの配置、サイズ決めおよび描画に、抽象化されたメソッドや一般化されたメソッドを使うことが極めて重要なのはこのためです。 レイアウトマネージャ: レイアウトマネージャを利用するのは、多くの開発者にとって、非常に簡単な作業かもしれませんが、多くのプログラマは、明示的にコントロールの X と Y の座標を設定することによって、アプリケーションを微調整しようとします。 このようにして作成されたアプリケーションが、ある時点で、別のルックアンドフィール、別のプラットフォームで動作する場合、コンポーネントが、互いに重なって描画されたり、コンテナの境界をはみ出したりなどひどい UI になる可能性があります。一般論として、座標を明示的に指定してボタンとコントロールを配置しても移植性があると仮定するのは危険です。ルックアンドフィールが異なれば、コントロールのサイズの違いから、UI は突然、意図したものとはものとは全く違って見える可能性があります。AWT のレイアウトマネージャは、抽象化された位置定数( コンポーネントのサイズ: コンポーネントのサイズを明示的に設定するのも場合によっては、危険な習慣です。ルックアンドフィールごとに、フォントのスタイルとサイズが異なるかもしれないからです。これらのフォントサイズはほぼ確実に、テキストを含むコンポーネントの必要サイズに影響を与えるでしょう。明示的にサイズ指定されたコンポーネントを、より大きなフォントサイズを持つ別のルックアンドフィールに移すと大きな問題を引き起こす可能性があります。UI コンポーネントを、移植性を維持しながら、適正な最小サイズに保つ最も安全な方法は、ただ次のメソッドを呼び出すことです。
ここで、 コンポーネントの色: どのルックアンドフィールでも、すべてではないにしろ、ほとんどのコントロールで共通の色合いとスタイルを採用しているので、開発者は標準の UI クラスのルックアンドフィールに調和するカスタムのコンポーネントを作成しようという気になることもあるでしょう。これは完全に正当なことですが、不注意な開発者は、現在のルックアンドフィールに一致すると考える色を明示的に設定してしまうかもしれません。その場合、ルックアンドフィールを変えると、コンテナのどこかにあるボタンが非常に見苦しくなることがあります。カスタムのコントロールとその他の標準のコンポーネントとを確実に一致させる一番良い方法は、最適な色またはアイコンを
これは、現在のルックアンドフィールにふさわしい色を返します。これらの標準メソッドを使うもう 1 つの利点は、これらの標準メソッドが、簡単には再現できない特殊な背景とアイコン(Aqua のコンテナとウィンドウに使うしま模様の背景など。これは、上記コードにより返されます)も提供していることです。 スクロールバー付きのウィンドウ(JScrollPanes の使用)Aqua Human Interface Guidelines が推奨する UI 設計の具体例の 1 つに、ウィンドウ内容のナビゲーションにスクロールバーを使うウィンドウがあります。デフォルトでは、
Aqua のファイルダイアログ
一般的には、アプリケーションをできるだけネイティブの外観にするために、開発者は、AWT の .pkg ファイルと .app ファイルの処理: Java アプリケーションの中で Mac OS X のアプリケーションバンドルとインストーラパッケージを扱う方法にも考慮が必要です。.app ファイルと .pkg ファイルは、厳密にいえばディレクトリであり、
指定可能な値は、
これらのプロパティに指定可能な値は、 これらのプロパティの使用に関しては、いくつかの既知の問題があります。
つまり、現時点では、これらのプロパティを使用した場合、.app ファイルのみ、または .app ファイルと .pkg ファイルの両方をナビゲーション不可能にできます。
Macintosh 固有の仕立て次の数節では、Java アプリケーションを、可能な限り Aqua に対応した Mac OS X アプリケーションに近づけるという具体的な目的のために、Java アプリケーションに対して行える変更や設計上の決定について説明します。ほかのプラットフォームでは影響のない変更もあれば、アプリケーションを複数のプラットフォームで動作させる場合には、コードを条件に応じて、パッケージ化または実行する必要がある変更もあります。 Macintosh のメニューバーの使用Java の UI モデルと Macintosh の UI モデルの違いの 1 つは、Swing ではアプリケーションのメニューバーはフレーム(ウィンドウ)ごとに適用されるということです。Windows のモデルと同じように、Swing によるアプリケーションのメニューバーは、フレームのタイトルバーの直下に表示されます。これは、アプリケーションのすべてのウィンドウを制御する「スクリーン」メニューバーが、アプリケーションに 1 つだけある Macintosh のモデルとは異なります。この問題を簡単に解決するために、次のランタイムプロパティが追加されています。
このプロパティは、
ダイアログウィンドウにメニューを付ける必要を感じた場合には、UI を再考した方がよいでしょう。ダイアログは、情報提供するか、ユーザに 1 つの簡単な決定を提示するものでなければなりません。メニューバーを必要とする機能を持つウィンドウは、 スクリーンメニューバーを有効にする方法の簡単な要約は、Q&A 1003 からも入手できます。 残念ながら、これにより解決されるのは問題の一部(視覚的な配置)にすぎません。「ウィンドウごとに 1 つのメニューバーを」という根本的な問題は依然存在します。つまり、メニューは、スクリーンの最上部に表示されますが、メニューが割り当てられている特定のウィンドウにフォーカスがあたっているときだけです。アプリケーションに複数のウィンドウがあり、メニューバーを持つウィンドウ以外のウィンドウにフォーカスがあたったときには、メニューバーが消えてしまいます。Aqua Human Interface Guidelines では、アプリケーションのメニューバーは常に表示されていなければならないと規定されています。アラートダイアログのような重要でないウィンドウでもメニューバーが表示されなければなりません(このダイアログのメニューは無効にした方がよいかもしれませんが)。 この問題に対処する方法はいくつかありますが、最も一般的な方法は、アプリケーションの各独立フレームに同じメニューバーを生成するメニューファクトリを作成し使用することです。こうすることで、フォーカスが各フレームに移っても、フレームには、スクリーンの最上部にメニューバーがそのまま表示されています。 ウィンドウメニューAqua Human Interface Guidelines の指示の 1 つに、Mac OS X アプリケーションはすべて、現在開かれているすべてのウィンドウを常に把握できるようにするために、
ウィンドウメニューを提供するべきだとあります。Java の Swing でこの機能を実装するのは不可能ではありませんが、中でも、このテクニカルノートで示した 2 つの推奨事項、つまりMacintosh のメニューバーと独立したフローティングフレームに関する推奨事項を応用することが要求されます。
これら 2 つの要件を満たさなくても、ウィンドウメニューは実装できるものの、これらは、Java アプリケーションを可能な限り Mac 風にするために相乗的に機能します。メニューバーをすべてに表示するという問題と同様、Swing の現在のアーキテクチャでは、アプリケーションの現在の状態に合わせて、常に更新され同期化される複数のメニューとメニュー項目を持たせるのは困難です。
しかし、 ウィンドウメニューには、現在アクティブな(可視)ウィンドウのリストが、現在選択され最前面に表示されているウィンドウがあればそれに対応するメニュー項目にチェックマークが付いた状態で、表示されていなければなりません。また、特定のウィンドウのメニュー項目を選択することで、対応するウィンドウが最前面に来なければなりません。 新しく開かれたウィンドウはメニューに追加され、閉じられたウィンドウはメニューから取り除かれなければなりません。メニュー項目の順序は通常、ウィンドウが表示された順序です(詳細な説明については Aqua Human Interface Guidelines を参照)。 アプリケーションメニューAWT または Swing を使っている Java アプリケーション、およびダブルクリック起動が可能な .app ファイルにパッケージ化されている Java アプリケーションはすべて自動的に、Mac OS X のネイティブアプリケーションと同様、アプリケーションメニューを使って起動されます。このアプリケーションメニューには、デフォルトでは、タイトルとしてメインクラスの完全な名前が含まれています。この名前は、
アプリケーションメニューをカスタマイズするための次の手順は、アプリケーションメニューの項目が選択されたときに、独自に作成した処理コードが実際に呼び出されるようにすることです。アップルでは、このために、
特定のアプリケーションメニュー項目を処理するには、次の手順で行います。
これらの実装例は、Project Builder で新しい Java Swing アプリケーションを開くだけで見ることができます。
Mac OS X 10.1 と 10.2 (Jaguar)における、 アプリケーションメニューのカスタマイズMac OS X 上の Java アプリケーションへのアプリケーションメニューの追加について、またそれらのメニュー項目の利用方法についてはすでに説明しました 。ほかのプラットフォームにアプリケーションを配備する予定があり、メニューバー内のほかの場所([ファイル]メニュー、[編集]メニューなど)に、[環境設定]、[終了]、または[...について]の各項目を配置する必要がある場合は、条件に応じてこの配置を行なった方がよいでしょう。たとえば、2 つの異なる[環境設定]メニュー項目があったり、MRJ の[終了]項目と同時に[終了]メニュー項目があったりしても害はありませんが、Mac ユーザにとっては、アプリケーションメニューにおなじみの項目がアプリケーションメニューにだけあって、ほかのどこにもない方が紛らわしくないでしょう。これは小さな変更ですが、Mac OS X の Java アプリケーションのルックアンドフィールでは大きな違いを生むかもしれません。 追加の MRJ ハンドラアプリケーションメニューを扱うために提供されているインタフェースのほかに、現在の Mac OS X に対応した Java のリリースでは、2 つの機能的な MRJ ハンドラがサポートされています。
これらのハンドラインタフェースは、Mac OS X の Finder における Java アプリケーションの動作の強化を目的とするもので、上記のアプリケーションメニューインタフェースと同じように使用します。アプリケーションが Finder から MRJOpenDocumentHandler を使って開けるファイル形式の登録は、アプリケーションバンドルの Info.plist ファイルの最上位レベルで追加のキーを使って、Cocoa アプリケーションまたは Carbon アプリケーションの場合と同じように行います。詳細については、『Bundle Keys』の CFBundleDocumentTypes の節を参照してください。 Java アプリケーションの起動Macintosh 体験の最も身近なそして顕著な特徴はおそらく、アプリケーションがダブルクリック起動が可能なアイコンまたはパッケージにより起動されることでしょう。Java アプリケーションが、「良き Mac OS X 市民」になるためには、起動のためにコマンドラインの使用を要求するべきではありません。エンドユーザのために、Java アプリケーションをダブルクリック起動可能にする方法がいくつかあります。
もちろん .app による方法が、Java アプリケーションをパッケージ化する最も Mac 風な方法です。 Dock アイコンの設定Mac OS X で起動されるアプリケーションにはすべて、Finder の Dock の中に対応するアイコンがあります。これは、Mac OS X のグラフィカルな Java アプリケーションだけでなく、.app バンドルでパッケージ化されている非グラフィカルなアプリケーションの場合も同様です。デフォルトの Java アイコンが、Dock に入れるひな形として提供されていますが、開発者は、次の 2 つのどちらかの方法を使って Java アプリケーションのカスタムアイコンを指定することができます。
このことは、ダブルクリック起動が可能な JAR ファイルを使って配備されるアプリケーションは、Dock アイコンをカスタマイズできないことを意味します。したがって、上に挙げたほかの配備方法を検討するようお勧めします。残念ながら、Java Web Start がアプリケーションを起動する方法に起因して、現時点では、Java Web Start でも Dock アイコンのカスタマイズは不可能です。
要約このテクニカルノートでは、開発者が、Mac OS X で動作する Java アプリケーションに、Mac OS X のユーザ体験の利点をもたらすことができる領域について簡単に見てきました。Mac OS X 上の Java アプリケーションを、できるだけネイティブアプリケーションらしい外観にするために、開発者の方々が、ランタイムプロパティから、互換性を保つためのベストプラクティス、Mac 固有の微調整に至るまで、利用できる手段を最大限に活用できるよう願っています。 ダウンロード
|